﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sakura.Media.AviSynth.Native
{
	/// <summary>
	/// AVS 过滤器方法使用。
	/// </summary>
	/// <param name="env">运行过滤器方法的脚本环境。</param>
	/// <param name="args">过滤器方法的参数。</param>
	/// <param name="userData">其他相关用户数据。</param>
	/// <returns>过滤器方法的过滤结果。</returns>
	internal delegate AvsValue AvsApplyFunc(IntPtr env, AvsValue args, IntPtr userData);

	/// <summary>
	/// AVS 退出注册方法。
	/// </summary>
	/// <param name="userData">相关用户数据。</param>
	/// <param name="pEnv">环境的指针。</param>
	internal delegate void AvsShutDownFunc(IntPtr userData, IntPtr pEnv);

	/// <summary>
	/// 过滤器中用于获得帧信息的回调方法。
	/// </summary>
	/// <param name="filter">过滤器对象。</param>
	/// <param name="n">要获得的帧的编号。</param>
	/// <returns>帧信息的指针。</returns>
	internal delegate IntPtr GetFrameFunc(ref AvsFilterInfo filter, int n);

	/// <summary>
	/// 过滤器中用于获得帧的奇偶性的回调方法。
	/// </summary>
	/// <param name="filter">过滤器对象。</param>
	/// <param name="n">要获得的帧的编号。</param>
	/// <returns>表示帧的奇偶性的值。</returns>
	internal delegate int GetParityFunc(ref AvsFilterInfo filter, int n);
	/// <summary>
	/// 过滤器中用于获得音频数据的回调方法。
	/// </summary>
	/// <param name="filter">过滤器对象。</param>
	/// <param name="buffer">存放音频数据的缓冲区。</param>
	/// <param name="start">音频样本的起始编号。</param>
	/// <param name="count">音频样本的个数。</param>
	/// <returns>表示操作是否成功的代码。</returns>
	internal delegate int GetAudioFunc(ref AvsFilterInfo filter, IntPtr buffer, long start, long count);
	/// <summary>
	/// 过滤器中用于设置缓存提示的回调方法。
	/// </summary>
	/// <param name="filter">过滤器对象。</param>
	/// <param name="cacheHints">缓存提示值。</param>
	/// <param name="frameRange">帧返回。</param>
	/// <returns>表示操作是否成功的代码。</returns>
	internal delegate int SetCacheHintsFunc(ref AvsFilterInfo filter, int cacheHints, int frameRange);
	/// <summary>
	/// 过滤器中用于释放过滤器的回调方法。
	/// </summary>
	/// <param name="filter">要释放的过滤器对象。</param>
	internal delegate void FreeFilterFunc(ref AvsFilterInfo filter);
}
